#include <Servo.h>

// 基础配置
const int SERVO_PIN = 9;          // 舵机控制引脚
const int ANGLE_MIN = 0;          // 最小角度
const int ANGLE_MAX = 180;        // 最大角度
const int STEP_DELAY = 10;        // 每步延时（控制转速）

Servo servo;                      // 舵机对象
int currentAngle = ANGLE_MIN;     // 当前角度
int angleDir = 1;                 // 转动方向（1=正转，-1=反转）
unsigned long lastTime = 0;       // 非阻塞延时时间戳

void setup() {
  Serial.begin(9600); // 开启串口
  delay(200);         // 延迟200ms，避开上电不稳定期（减少抖动）

  // 直接挂载舵机，不依赖返回值（核心修改）
  servo.attach(SERVO_PIN);
  Serial.println("尝试挂载舵机（引脚9），开始初始化...");

  // 上电软启动：缓慢转到初始角度，消除上电抖动
  softStart(ANGLE_MIN);
  Serial.println("舵机初始化完成，开始正常运行！");
}

// 软启动函数：缓慢转到目标角度，消除上电抖动
void softStart(int targetAngle) {
  // 步骤1：先发送目标角度指令，让舵机直接归位（单次指令，无逐步跳转）
  servo.write(targetAngle);
  // 步骤2：延迟足够时间，让舵机平稳转到目标角度（避免立即进入循环）
  delay(500); // 500ms足够舵机完成0-180度转动，可根据舵机转速调整
  // 步骤3：同步当前角度，避免循环逻辑出错
  currentAngle = targetAngle;
}

void loop() {
  // 非阻塞延时：替代delay()，不影响其他操作
  unsigned long now = millis();
  if (now - lastTime >= STEP_DELAY) {
    lastTime = now;

    // 调整转动方向（到达边界时反转）
    if (currentAngle >= ANGLE_MAX) {
      angleDir = -1;
    } else if (currentAngle <= ANGLE_MIN) {
      angleDir = 1;
    }

    // 更新角度并控制舵机（双重边界保护）
    currentAngle += angleDir;
    currentAngle = constrain(currentAngle, ANGLE_MIN, ANGLE_MAX);
    servo.write(currentAngle);

    // 可选：串口打印当前角度（调试用）
    // Serial.print("当前角度：");
    // Serial.println(currentAngle);
  }

  // 此处可添加其他代码，不会被阻塞
}